package com.example.terminalservice.controller;

import com.example.terminalservice.common.Result;
import com.example.terminalservice.pojo.Role;
import com.example.terminalservice.service.RoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 28142
 * @description RoleController
 * @date 2023/8/6 9:30
 */
@RestController
@RequestMapping("/role")
@Api(tags = "角色管理")
public class RoleController {
    @Autowired
    private RoleService roleService;

    /**
     * 获取所有角色信息，只有在分配角色时才需要获取所有角色信息，因此给它的授权为sys:user:role
     * @author 杨雨盛
     * @date 2023/8/6 9:32
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("获取所有角色信息")
    @GetMapping
    @PreAuthorize("hasAnyAuthority('sys:user:role')")
    public Result findAll() {
        return Result.success(roleService.list());
    }

    /**
     * 根据用户查询对应角色列表，只有在分配角色时才需要根据用户获取对应角色信息，因此给它的授权为sys:user:role
     * @author 杨雨盛
     * @date 2023/8/6 9:51
     * @param userId
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("根据用户查询对应角色列表")
    @GetMapping("/{userId}")
    @PreAuthorize("hasAnyAuthority('sys:user:role')")
    public Result getRolesByUser(@PathVariable Integer userId) {
        return roleService.getRolesByUser(userId);
    }

    /**
     * 给用户分配角色
     * @author 杨雨盛
     * @date 2023/8/6 10:26
     * @param userId
     * @param ids
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("给用户分配角色")
    @PutMapping("/{userId}")
    @PreAuthorize("hasAnyAuthority('sys:user:role')")
    public Result setRolesByUser(@PathVariable Integer userId,
                                 @RequestParam List<Integer> ids) {
        return roleService.setRolesByUser(userId, ids) ? Result.success() : Result.error();
    }

    /**
     * 分页条件查询角色列表
     * @author 杨雨盛
     * @date 2023/8/6 22:40
     * @param pageNum
     * @param pageSize
     * @param name
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("分页条件查询角色列表")
    @GetMapping("/{pageNum}/{pageSize}")
    @PreAuthorize("hasAnyAuthority('sys:role')")
    public Result findPage(@PathVariable Integer pageNum,
                           @PathVariable Integer pageSize,
                           @RequestParam(required = false) String name) {
        return roleService.findPage(pageNum, pageSize, name);
    }

    /**
     * 新增或修改角色
     * @author 杨雨盛
     * @date 2023/8/6 23:06
     * @param role
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("新增或修改角色")
    @PostMapping
    @PreAuthorize("hasAnyAuthority('sys:role:add', 'sys:role:update')")
    public Result saveRole(@RequestBody Role role) {
        return roleService.saveRole(role) ? Result.success() : Result.error();
    }

    /**
     * 根据id删除角色
     * @author 杨雨盛
     * @date 2023/8/6 23:09
     * @param id
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("根据id删除角色")
    @DeleteMapping("/{id}")
    @PreAuthorize("hasAnyAuthority('sys:role:del')")
    public Result delRole(@PathVariable Integer id) {
        return roleService.removeById(id) ? Result.success() : Result.error();
    }

    /**
     * 批量删除角色
     * @author 杨雨盛
     * @date 2023/8/6 23:10
     * @param ids
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("批量删除角色")
    @PostMapping("/del/batch")
    @PreAuthorize("hasAnyAuthority('sys:role:del')")
    public Result delBatch(@RequestBody List<Integer> ids) {
        return roleService.removeBatchByIds(ids) ? Result.success() : Result.error();
    }
}
